package com.woniuxy.project115.kaer.tenant.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.retry.MessageRecoverer;
import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * @author HuH
 * @version 1.0
 * @CreatTime 2024-11-25 15:07
 * @description
 */
@Configuration
public class RabbitMQConfig {
//    @Bean
//    public DirectExchange errorExchange(){
//        return new DirectExchange("error-ex");
//    }
//    @Bean
//    public Queue errorMessageQueue(){
//        return new Queue("errorMessageQueue",true);
//    }
//    @Bean
//    public Binding bindingErrorExchange(){
//        return BindingBuilder.bind(errorMessageQueue()).to(errorExchange()).with("error");
//    }
    /**
     * @description: 更新缓存队列
     */
    @Bean
    public Queue updateCacheQueue() {
        return new Queue("update_cache_queue");
    }

    /**
     * @description: 创建交换机
     */
    @Bean
    public DirectExchange delayExchange(){
        //创建交换机用于将死信通过交换机转发到其他队列中
        return new DirectExchange("delay-ex");
    }

    /***
     * @description: 等待检查订单的队列
     */
    @Bean
    public Queue delayCheckOrderQueue() {
        Map<String, Object> params = new HashMap<>();
        //定义该队列中消息的生存时间 单位毫秒 生存时间最终对应业务的延迟执行时间
        params.put("x-message-ttl", 5 * 60 * 1000);
        // x-dead-letter-exchange 属性用于声明死信转发到的交换机
        params.put("x-dead-letter-exchange", "delay_ex");
        // x-dead-letter-routing-key 声明了这些死信在转发时携带的路由键名称。
        params.put("x-dead-letter-routing-key", "check_order");
        return new Queue("delay_check_order_queue", true, false, false, params);
    }

    /**
     * @description: 延迟队列 自动好评
     */
    @Bean
    public Queue delayEvaluateOrderQueue() {
        Map<String, Object> params = new HashMap<>();
        //定义该队列中消息的生存时间 单位毫秒 生存时间最终对应业务的延迟执行时间
        params.put("x-message-ttl", 1 * 60 * 1000);
        // x-dead-letter-exchange 属性用于声明死信转发到的交换机
        params.put("x-dead-letter-exchange", "delay_ex");
        // x-dead-letter-routing-key 声明了这些死信在转发时携带的路由键名称。
        params.put("x-dead-letter-routing-key", "evaluate_order");
        return new Queue("delay_evaluate_order_queue", true, false, false, params);
    }

    /**
     * @description: 延迟队列 自动验收
     */
    public Queue delayCompleteOrderQueue() {
        Map<String, Object> params = new HashMap<>();
        //定义该队列中消息的生存时间 单位毫秒 生存时间最终对应业务的延迟执行时间
        params.put("x-message-ttl", 24 * 24 * 60 * 1000);
        // x-dead-letter-exchange 属性用于声明死信转发到的交换机
        params.put("x-dead-letter-exchange", "delay_ex");
        // x-dead-letter-routing-key 声明了这些死信在转发时携带的路由键名称。
        params.put("x-dead-letter-routing-key", "complete_order");
        return new Queue("delay_complete_order_queue", true, false, false, params);
     }
}
